package com.hr.runnerbuddy.database;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {

	private static final String DB_NAME = "rbdb";
	private static final int DB_VERSION = 5;

	// Alle tabellen
	private static final String PARCOUR_TABLE = "Parcour";
	private static final String PARCOURP_TABLE = "Parcourpunten";
	private static final String LOOPSESSIE_TABLE = "Loopsessie";
	private static final String LOOPSESSIEP_TABLE = "Loopsessiepunten";

	// column namen parcour
	public static final String PARCOUR_ID = "parcour_id";
	public static final String PARCOUR_NAAM = "naam";
	public static final String PARCOUR_LENGTE = "lengte";
	public static final String PARCOUR_PLAATJE = "plaatje";

	// column namen parcourpunten
	public static final String PARCOURP_ID = "parcourpunten_id";
	public static final String PARCOURP_LONGITUDE = "longitude";
	public static final String PARCOURP_LATITUDE = "latitude";

	// column namen loopsessie
	public static final String LOOPSESSIE_ID = "loopsessie_id";
	public static final String LOOPSESSIE_TIMESTAMP = "timestamp";

	// colum namen loopsessiepunten
	public static final String LOOPSESSIEP_ID = "loopsessiepunten_id";
	public static final String LOOPSESSIEP_AFSTAND = "afstand";
	public static final String LOOPSESSIEP_TIMESTAMP = "timestamp";
	public static final String LOOPSESSIEP_SNELHEID = "snelheid";

	private DbHelper helper;
	private SQLiteDatabase database;
	private final Context context;

	private static class DbHelper extends SQLiteOpenHelper {

		public DbHelper(Context context) {
			super(context, DB_NAME, null, DB_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			// Aanmaken Parcour tabel
			String sql = "CREATE TABLE " + PARCOUR_TABLE + " (" + PARCOUR_ID
					+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + PARCOUR_NAAM
					+ " TEXT, " + PARCOUR_LENGTE + " INTEGER NOT NULL, "
					+ PARCOUR_PLAATJE + " BLOB NOT NULL);";

			db.execSQL(sql);

			// Aanmaken Parcourpunten tabel
			sql = "CREATE TABLE " + PARCOURP_TABLE + " (" + PARCOURP_ID
					+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + PARCOUR_ID
					+ " INTEGER, " + PARCOURP_LONGITUDE + " REAL NOT NULL, "
					+ PARCOURP_LATITUDE + " REAL NOT NULL, " + "FOREIGN KEY("
					+ PARCOUR_ID + ") references Parcour(" + PARCOUR_ID + "));";

			db.execSQL(sql);

			// Aanmaken Loopsessie tabel
			sql = "CREATE TABLE " + LOOPSESSIE_TABLE + " (" + LOOPSESSIE_ID
					+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + PARCOUR_ID
					+ " INTEGER, " + LOOPSESSIE_TIMESTAMP + " TEXT,"
					+ "FOREIGN KEY(" + PARCOUR_ID + ") REFERENCES Parcour("
					+ PARCOUR_ID + "));";

			db.execSQL(sql);

			// Aanmaken Loopsessiepunten tabel
			sql = "CREATE TABLE " + LOOPSESSIEP_TABLE + " (" + LOOPSESSIEP_ID
					+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
					+ LOOPSESSIEP_AFSTAND + " INTEGER, "
					+ LOOPSESSIEP_TIMESTAMP + " TEXT, " + LOOPSESSIEP_SNELHEID
					+ " INTEGER, " + LOOPSESSIE_ID + " INTEGER, "
					+ "FOREIGN KEY(" + LOOPSESSIE_ID
					+ ") REFERENCES Loopsessie(" + LOOPSESSIE_ID + "));";

			db.execSQL(sql);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// Verwijder tabellen + Data
			db.execSQL("DROP TABLE IF EXISTS " + PARCOUR_TABLE);
			db.execSQL("DROP TABLE IF EXISTS " + PARCOURP_TABLE);
			db.execSQL("DROP TABLE IF EXISTS " + LOOPSESSIE_TABLE);
			db.execSQL("DROP TABLE IF EXISTS " + LOOPSESSIEP_TABLE);

			// Maak tabellen opnieuw aan
			onCreate(db);
		}

	}

	public DBAdapter(Context c) {
		context = c;
	}

	public DBAdapter open() {
		helper = new DbHelper(context);
		database = helper.getWritableDatabase();
		return this;
	}

	public void close() {
		helper.close();
	}

	public void addParcour(String naam, int lengte, byte[] plaatje) {
		ContentValues content = new ContentValues();
		content.put(PARCOUR_NAAM, naam);
		content.put(PARCOUR_LENGTE, lengte);
		content.put(PARCOUR_PLAATJE, plaatje);
		database.insert(PARCOUR_TABLE, null, content);
	}

	public ArrayList<Parcour> getAllParcours() {
		ArrayList<Parcour> parcours = new ArrayList<Parcour>();
		String[] columns = new String[] { PARCOUR_ID, PARCOUR_NAAM,
				PARCOUR_LENGTE, PARCOUR_PLAATJE };
		Cursor c = database.query(PARCOUR_TABLE, columns, null, null, null,
				null, null);

		int iNaam = c.getColumnIndex(PARCOUR_NAAM);
		int iLengte = c.getColumnIndex(PARCOUR_LENGTE);
		int iPlaatje = c.getColumnIndex(PARCOUR_PLAATJE);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			parcours.add(new Parcour(c.getString(iNaam), c.getInt(iLengte), c.getBlob(iPlaatje)));
		}

		return parcours;
	}
	
	public int getParcourRowsAmount() {
		String sql = "SELECT Count("+PARCOUR_ID+") FROM "+PARCOUR_TABLE;
		Cursor c = database.rawQuery(sql, null);
		int rowamount = 0;
		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			rowamount = c.getInt(0);
			Log.d("HALKDJFOAJDSOKFJSD", "amount = "+rowamount);
		}
		return rowamount;
	}

	public ArrayList<Parcour> getParcour(int parcourid) {
		ArrayList<Parcour> parcours = new ArrayList<Parcour>();
		String[] columns = new String[] { PARCOUR_ID, PARCOUR_NAAM,
				PARCOUR_LENGTE, PARCOUR_PLAATJE };
		Cursor c = database.query(PARCOUR_TABLE, columns, PARCOUR_ID + "="
				+ parcourid, null, null, null, null);

		int iNaam = c.getColumnIndex(PARCOUR_NAAM);
		int iLengte = c.getColumnIndex(PARCOUR_LENGTE);
		int iPlaatje = c.getColumnIndex(PARCOUR_PLAATJE);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			parcours.add(new Parcour(c.getString(iNaam), c
					.getInt(iLengte), c.getBlob(iPlaatje)));
		}

		return parcours;
	}

	public void addParcourPunten(int parcourID, double longitude,
			double latitude) {
		ContentValues content = new ContentValues();
		content.put(PARCOUR_ID, parcourID);
		content.put(PARCOURP_LONGITUDE, longitude);
		content.put(PARCOURP_LATITUDE, latitude);
		database.insert(PARCOURP_TABLE, null, content);
	}

	public ArrayList<ParcourPunt> getParcourpunt(int parcourid, int puntid) {
		ArrayList<ParcourPunt> parcourpunten = new ArrayList<ParcourPunt>();
		String[] columns = new String[] { PARCOURP_ID, PARCOUR_ID,
				PARCOURP_LONGITUDE, PARCOURP_LATITUDE };
		Cursor c = database.query(PARCOURP_TABLE, columns, PARCOUR_ID + "="
				+ parcourid + " AND " + PARCOURP_ID + "=" + puntid, null, null,
				null, null);

		int iParcourID = c.getColumnIndex(PARCOUR_ID);
		int iLongitude = c.getColumnIndex(PARCOURP_LONGITUDE);
		int iLatitude = c.getColumnIndex(PARCOURP_LATITUDE);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			parcourpunten.add(new ParcourPunt(c
					.getInt(iParcourID), c.getDouble(iLongitude), c
					.getDouble(iLatitude)));
		}

		return parcourpunten;
	}

	public ArrayList<ParcourPunt> getParcourpunten(int parcourid) {
		ArrayList<ParcourPunt> parcourpunten = new ArrayList<ParcourPunt>();
		String[] columns = new String[] { PARCOURP_ID, PARCOUR_ID,
				PARCOURP_LONGITUDE, PARCOURP_LATITUDE };
		Cursor c = database.query(PARCOURP_TABLE, columns, PARCOUR_ID + "="
				+ parcourid, null, null, null, null);

		int iParcourID = c.getColumnIndex(PARCOUR_ID);
		int iLongitude = c.getColumnIndex(PARCOURP_LONGITUDE);
		int iLatitude = c.getColumnIndex(PARCOURP_LATITUDE);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			parcourpunten.add(new ParcourPunt(c
					.getInt(iParcourID), c.getDouble(iLongitude), c
					.getDouble(iLatitude)));
		}

		return parcourpunten;
	}

	public void addLoopsessie(int parcourID, String timestamp) {
		ContentValues content = new ContentValues();
		content.put(PARCOUR_ID, parcourID);
		content.put(LOOPSESSIE_TIMESTAMP, timestamp);
		database.insert(LOOPSESSIE_TABLE, null, content);
	}

	public ArrayList<Loopsessie> getLoopsessie(int parcourid, int loopsessieid) {
		ArrayList<Loopsessie> loopsessies = new ArrayList<Loopsessie>();
		String[] columns = new String[] { LOOPSESSIE_ID, PARCOUR_ID,
				LOOPSESSIE_TIMESTAMP, };
		Cursor c = database.query(LOOPSESSIE_TABLE, columns, PARCOUR_ID + "="
				+ parcourid + " AND " + LOOPSESSIE_ID + "=" + loopsessieid,
				null, null, null, null);

		int iID = c.getColumnIndex(LOOPSESSIE_ID);
		int iParcourID = c.getColumnIndex(PARCOUR_ID);
		int iTimestamp = c.getColumnIndex(LOOPSESSIE_TIMESTAMP);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			loopsessies.add(new Loopsessie(c.getInt(iParcourID),
					c.getString(iTimestamp)));
		}
		//Geeft een arraylist terug met loopsessie objecten
		return loopsessies;
	}

	public ArrayList<Loopsessie> getAllLoopsessies(int parcourid) {
		ArrayList<Loopsessie> loopsessies = new ArrayList<Loopsessie>();
		String[] columns = new String[] { LOOPSESSIE_ID, PARCOUR_ID,
				LOOPSESSIEP_AFSTAND, LOOPSESSIE_TIMESTAMP };
		Cursor c = database.query(LOOPSESSIE_TABLE, columns, PARCOUR_ID + "="
				+ parcourid, null, null, null, null);

		int iID = c.getColumnIndex(LOOPSESSIE_ID);
		int iParcourID = c.getColumnIndex(PARCOUR_ID);
		int iTimestamp = c.getColumnIndex(LOOPSESSIE_TIMESTAMP);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			loopsessies.add(new Loopsessie(c.getInt(iParcourID),
					c.getString(iTimestamp)));
		}
		
		//Geeft een arraylist terug met loopsessie objecten
		return loopsessies;
	}

	public void addLoopsessiePunten(int afstand, String timestamp,
			int loopsessieid) {
		ContentValues content = new ContentValues();
		content.put(LOOPSESSIEP_AFSTAND, afstand);
		content.put(LOOPSESSIEP_TIMESTAMP, timestamp);
		content.put(LOOPSESSIE_ID, loopsessieid);
		database.insert(LOOPSESSIEP_TABLE, null, content);
	}

	public ArrayList<LoopsessiePunt> getLoopsessiePunt(int loopsessieid,
			int puntid) {
		ArrayList<LoopsessiePunt> loopsessiepunten = new ArrayList<LoopsessiePunt>();
		String[] columns = new String[] { LOOPSESSIEP_ID, LOOPSESSIEP_AFSTAND,
				LOOPSESSIEP_TIMESTAMP, LOOPSESSIE_ID };
		Cursor c = database.query(LOOPSESSIEP_TABLE, columns, LOOPSESSIE_ID
				+ "=" + loopsessieid + " AND " + LOOPSESSIEP_ID + "=" + puntid,
				null, null, null, null);

		int iID = c.getColumnIndex(LOOPSESSIEP_ID);
		int iAfstand = c.getColumnIndex(LOOPSESSIEP_AFSTAND);
		int iTimestamp = c.getColumnIndex(LOOPSESSIEP_TIMESTAMP);
		int iLoopsessieID = c.getColumnIndex(LOOPSESSIE_ID);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			loopsessiepunten.add(new LoopsessiePunt(c
					.getInt(iAfstand), c.getString(iTimestamp), c.getInt(iLoopsessieID)));
		}
		
		//Geeft een arraylist terug met loopsessiepunten objecten
		return loopsessiepunten;
	}

	public ArrayList<LoopsessiePunt> getAllLoopsessiePunten(int loopsessieid) {
		ArrayList<LoopsessiePunt> loopsessiepunten = new ArrayList<LoopsessiePunt>();
		String[] columns = new String[] { LOOPSESSIEP_ID, LOOPSESSIEP_AFSTAND,
				LOOPSESSIEP_TIMESTAMP, LOOPSESSIE_ID };
		Cursor c = database.query(LOOPSESSIEP_TABLE, columns, LOOPSESSIE_ID
				+ "=" + loopsessieid, null, null, null, null);
		
		int iID = c.getColumnIndex(LOOPSESSIEP_ID);
		int iAfstand = c.getColumnIndex(LOOPSESSIEP_AFSTAND);
		int iTimestamp = c.getColumnIndex(LOOPSESSIEP_TIMESTAMP);
		int iLoopsessieID = c.getColumnIndex(LOOPSESSIE_ID);

		for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
			loopsessiepunten.add(new LoopsessiePunt(c
					.getInt(iAfstand), c.getString(iTimestamp), c.getInt(iLoopsessieID)));
		}
		
		//Geeft een arraylist terug met loopsessiepunten objecten
		return loopsessiepunten;
	}

}